home *** CD-ROM | disk | FTP | other *** search
/ BBS Toolkit / BBS Toolkit.iso / rbbs_pc / rbbsasm.zip / ANSI.ASM < prev    next >
Assembly Source File  |  1987-11-08  |  6KB  |  134 lines

  1. ; ANSI1-6ASM  Revised 10/28/87 Jon Martin fix boundary bug
  2. ; ANSI1-5ASM  Revised 8/24/85 Dave Terry for QuickBasic Compiler
  3. ; ANSI1-4ASM  Revised 8/23/85 Dave Staehlin
  4.  
  5. ANSI_PRNT SEGMENT PUBLIC 'CODE'         ;By  David W. Terry
  6.           ASSUME CS:ANSI_PRNT           ;    3036 So. Putnam Ct.
  7.           PUBLIC ANSI                   ;    West Valley City, UT 84120
  8.  
  9. ;                      Screen scroll mods by David C. Staehlin
  10. ;                                            5430 Candle Glow NE
  11. ;                                            Albuquerque, NM 87111
  12. ;
  13. ;                                       Data (505) 821-7379 24 Hrs, 2400 Baud
  14. STRG_LEN          DW 0                  ;CHANGED TO LENGTH OF STRING PASSED
  15. VID_PAGE          DB 0                  ;Active video page
  16. ;
  17. ;
  18. ANSI      PROC    FAR
  19.           PUSH    BP
  20.           MOV     BP,SP
  21. ;
  22.           MOV     SI,10[BP]         ;GET STRING DESCRIPTOR
  23.           MOV     BL,[SI+ 2]        ;REARRANGE LOW/HIGH BYTES
  24.           MOV     BH,[SI+ 3]        ;NOW BX HOLDS THE ADDRESS OF THE STRING
  25.           MOV     AX,[SI]           ;GET STRING LENGTH
  26.           ADD     AX,BX             ;ADD INITIAL OFFSET (BX) TO LENGTH
  27.           MOV     STRG_LEN,AX       ;STORE OFFSET PLUS LENGTH
  28.  
  29.           PUSH    BX
  30.           MOV     AH,15             ;Get current video state
  31.           INT     10H
  32.           MOV     VID_PAGE,BH       ;Save it
  33.           POP     BX
  34.  
  35.           MOV     AH,02             ;SET UP FOR FUNCTION CALL 02H
  36. LOOP:
  37.           MOV     DL,[BX]           ;SET DL TO CHARACTER TO PRINT
  38.           PUSH    DX                ;Save the character in AX 'till we check..
  39.           CALL    WHERE_ARE_WE      ; where the cursor is.......
  40.           CMP     DH,17H            ;Row 24?
  41.           JL      NOPE              ; Jump if less......
  42.           CMP     DX,174FH
  43.           JZ      NEXT1
  44.           CMP     DH,18H            ;Row 25?
  45.           JZ      NOPE              ;Don't scroll line 25
  46. ;         DEC     BX                ; Else backup one character
  47. ;         JMP     SCROLL2           ; And go scroll the screen
  48. ;
  49. NEXT2:    POP     DX                ;And restore the stack to where it was
  50.           CMP     DL,0AH            ;Do we have a line feed?
  51.           JZ      SCROLL            ; Yup - scroll this sucker!
  52.           CMP     DL,0DH            ;  How about a carriage return?
  53.           JNZ     NOPE1             ;  Nope - just go display it.......
  54.           INC     BX                ;  Yup - see if next char is a line feed
  55.           MOV     DX,[BX]
  56.           CMP     DL,0AH            ;  Well, is it?
  57.           JZ      SCROLL            ;  It sure is - let's go scroll
  58.           DEC     BX                ;  Oops - just a carriage return
  59.           JMP     SCROLL            ;  But let's go scroll it anyway
  60.  
  61. NEXT1:    POP     DX
  62.           INT     21H
  63.           CALL SCROLLIT
  64.           JMP     EXIT1
  65.  
  66. NOPE:     POP     DX
  67. NOPE1:    INT     21H               ;Else just display it - same old boring stuff
  68. SKIPIT:   INC     BX
  69.           CMP     BX,STRG_LEN
  70.           JB      LOOP              ;LOOP UNTIL ALL CHARS PROCESSED
  71. ;
  72. EXIT1:    MOV     AH,03             ;SET UP FOR ROM-BIOS CALL (03H)
  73.           MOV     BH,VID_PAGE       ;TO READ THE CURRENT CURSOR POSITION
  74.           INT     10H               ;  DH = ROW   DL = COLUMN
  75.           INC     DH                ;ADD 1 TO ROW (BECAUSE TOP OF SCREEN = 0)
  76.           INC     DL                ;ADD 1 TO COL (BECAUSE POS 1 = 0)
  77. ;
  78.           MOV     SI,[BP]+ 8
  79.           MOV     [SI],DH           ;PASS BACK ROW COORDINATE
  80.           MOV     SI,[BP]+ 6
  81.           MOV     [SI],DL           ;PASS BACK COLUMN COORDINATE
  82. ;
  83.           POP     BP
  84.           RET     6
  85. ANSI      ENDP
  86.  
  87. Where_Are_We:                    ;Get the current cursor position
  88.           PUSH    AX                ;Save the registers
  89.           PUSH    BX
  90.           PUSH    CX
  91.           MOV     AH,03             ;SET UP FOR ROM-BIOS CALL (03H)
  92.           MOV     BH,VID_PAGE       ;TO READ THE CURRENT CURSOR POSITION
  93.           INT     10H               ;  DH = ROW   DL = COLUMN
  94.           POP     CX                ;Restore the registers
  95.           POP     BX
  96.           POP     AX
  97.           RET                        ;And go back from wence we came
  98.  
  99. SCROLL2:  POP     DX                ;Put the stack like it was
  100. SCROLL:   CALL    SCROLLIT          ;Scroll the screen
  101.           JMP     SKIPIT
  102.  
  103. SCROLLIT: PUSH    AX                ;Save the registers that will be affected
  104.           PUSH    BX
  105.           PUSH    CX
  106.           PUSH    DX
  107.           PUSH    BP
  108.           MOV     AH,2              ;Now set cursor position to 24,0
  109.           MOV     DX,1700H          ;so we can get the proper character
  110.           MOV     BH,VID_PAGE       ;attribute
  111.           INT     10H
  112.           MOV     AH,8              ;Get the current character attribute
  113.           MOV     BH,VID_PAGE
  114.           INT     10H
  115.           MOV     BH,AH             ;Transfer the attribute to BH for next call
  116.           MOV     AH,6              ;Otherwise scroll 24 lines
  117.           MOV     AL,1              ; Only blank line 24
  118.           MOV     CX,0000H          ; Begin scroll at position 0,0
  119.           MOV     DX,174FH          ; End scroll at Line 24, Col 79
  120.           INT     10H               ; And do it.......
  121.           MOV     AH,2              ;Now set cursor position to 24,0
  122.           MOV     DX,1700H
  123.           MOV     BH,VID_PAGE
  124.           INT     10H
  125.           POP     BP
  126.           POP     DX                ;Restore the stack like it was
  127.           POP     CX
  128.           POP     BX
  129.           POP     AX
  130.           RET
  131.  
  132. ANSI_PRNT ENDS
  133.           END
  134.